/***************************************************************************//**
 * @file mac_receiver.h
 * @brief for mac 
 * @author ze .
 * @date  2022/7/03.
 * @copyright Copyright 
 ******************************************************************************/

#ifndef _MAC_RECEIVER_H_
#define _MAC_RECEIVER_H_

#include "stdint.h"
#include "stateMachine.h"
#include "bsp_rf.h"

#define SYNC_RXWAKE_WINDOW_TIMEOUT   0x0030 //2ms最多，前导码阈值，单位均为1/32768s =1.5ms
#define LISTEN_BACKRSSI_WINDOW_TIMEOUT    0x001E //1ms最多，检测信道，单位均为1/32768s,todo,区分rfm和MHUB，MHUB具有天线分集，采集信号强度
//#define ACK_WINDOW_TIMEOUT               0x100//7.8ms内应答，等待前导码，考虑HUB的应答延时，单位均为1/32768s // 4000 // 测试V0.0;
#define ACK_WINDOW_TIMEOUT              700  //21 -15ms 不超过 WAIT_ACK_TIMEOUT 800=24ms的发送等待应答的延时
#define ACK_REGISTER_WINDOW_TIMEOUT     1000  //30ms

#define WAIT_ACK_PACKET_SYNC_PAYLOAD_TIMEOUT           0x500            //考虑应答转发功能，中继器的超时时间将上升到0x800，同BURST定义 //0x400== 31ms, 应答负载不超过128字节，考虑应答前导码很短？？，等待应答不FastHop快速跳频
#define WAIT_ACTIVE_NORMAL_PACKET_SYNC_PAYLOAD_TIMEOUT 0x500            // 38ms正常长度字节负载，一般不超过128字节，ToDo 考虑7.7ms前导码的持续长度
#define WAIT_BURST_PACKET_SYNC_PAYLOAD_TIMEOUT  0x800        //62ms 255字节最长报文负载长度有关，该宏为默认值 ToDo 考虑7.7ms前导码的持续长度，前导码长度+负载长度？
#define WAIT_SYNC_BCAST_PACKET_SYNC_PAYLOAD_TIMEOUT  0xA00        //50ms前导码+128字节payload 27ms

#define WAIT_SYNC_PAYLOAD_TIMEOUT_MAX       0xC00// 最大报文长度94ms 考虑系统最大报文长度，接收超时，255字节负载长度+255字节前导码

#define GET_DW_BIT_MASK(a) (((uint32_t)0x00000001) << a)

//#define RX_EVENT_TYPE_RF_SYNC_DONE_ENABLED

typedef enum 
{
    /******自清类接收请求事件，由内部自动清除，优先级高，排序*********/
    EN_RECV_REQ_LISTEN_BACKRSSI_WINDOW = 0, // 监听背景噪声，进行LBT
    EN_RECV_REQ_ACK_WINDOW,  //点对点或心跳上报后的应答接收窗口，在发送完成后开启一段时间的接收窗口，接收应答报文；该窗口是否应存在于MAC_TRANS内？，可指定信道、超时时间
    EN_RECV_REQ_SYNC_RXWAKE_WINDOW,      //SYNC BCAST 主动同步广播报文，仅HUB到RFM，由处于低功耗休眠态的RFM开启接收窗口接收，接收同步广播报文；，可指定信道、超时时间 
    /******保持类接收请求事件，由外部清除，优先级低*********/
    EN_RECV_REQ_FILE_DATA_RX_CHAN,       //File Data 文件数据报文，RFM到HUB，或HUB到RFM单/广播接收，需在规划SLOT F1、F2、F3、F4、F5时隙内在指定的burst信道接收， 可指定信道、超时时间   ，EN_RECV_REQ_FILE_DATA_RX_CHAN_FAST_CHANGED_FREQ,
    EN_RECV_REQ_ALWAYS_ON_CHAN ,         //对于常供电的设备 或 低功耗电池供电设备短暂开启的 接收常收模式；，可指定信道、超时时间或永久，常接收模式快速切频调用该指令    
    EN_RECV_REQ_MAX,
    EN_RECV_REQ_NONE
}RECV_REQ_E;

typedef enum 
{
    /************ x to——> RxStateMachine 每个状态对应 等待相应的事件类型*******************/
    EN_MAC_RX_EVENT_TYPE_RECV_REQ = 0, //需开启无线接收，进行接收信道切换 收包动作
    EN_MAC_RX_EVENT_TYPE_RF_PREAMBLE_DONE,
#ifdef RX_EVENT_TYPE_RF_SYNC_DONE_ENABLED
    EN_MAC_RX_EVENT_TYPE_RF_SYNC_DONE,
#endif
    EN_MAC_RX_EVENT_TYPE_RF_PAYLOAD_DONE,
    EN_MAC_RX_EVENT_TYPE_RECV_FINISH,
    EN_MAC_RX_EVENT_TYPE_RECV_INTERRUPT_IDLE, //打断接收，另其处于idle态

    EN_MAC_RX_EVENT_TYPE_NONE
}MAC_RX_EVENT_TYPE_E;

//对应eventType的data
#define RF_PREAMBLE_DONE_IS_PASS      0x01
#define RF_SYNC_DONE_IS_PASS          0x01
#define RF_PAYLOAD_DONE_IS_PASS       0x01

typedef enum
{
    EN_RX_STATE_IDLE_PREAMBLE_FOREVER= 0,    //RF芯片处于IDLE态 或 RX始终等待前导码状态
    EN_RX_STATE_WAIT_PREAMBLE_TIMEOUT, //芯片处于RX态，超时等待前导码状态,可超时返回失败
    EN_RX_STATE_WAIT_SYNC_PAYLODING,//芯片处于RX态已收到有效前导码，等待同步字通过和负载接收
    EN_RX_STATE_RX_SUCCED, 
    EN_RX_STATE_RX_FAILED,
    EN_RX_STATE_MAX
}MAC_RX_STATE_E;


typedef void(*PFUNC_RX_CALLBACK)(RF_PACKET_ST* pPacket,MAC_RX_STATE_E currState,void* pData);

//当不符合状态条件 返回失败
int setMacRecvEvent(RECV_REQ_E type, uint8_t chan);
uint32_t getMacRecvEventBitMask();

void setMacRxStateEvent(MAC_RX_EVENT_TYPE_E type, bool isPass);
bool getMacRxStateEventType(MAC_RX_EVENT_TYPE_E type);
uint8_t getMacRxStateEventValue(MAC_RX_EVENT_TYPE_E type);

bool macRxStateMachineEventCheck(STATEM_TYPE_ST* pEvent);
int macRxStateMachineRun(STATEM_TYPE_ST* pEvent);
void macRxStateMachineInit(PFUNC_RX_CALLBACK pArrayFun);
bool isRxStateRfIdle();
int8_t getCurrentBackRssi(void);
void clearHopOnflag(void);

//仅对SLEEP DEVICE 宏设备有效； 使能后，休眠设备将变为高功耗设备，电流约4mA，应用层需做异常保护，超时关闭机制
void rxAlwaysOnEnable(bool isEnable);


#endif//
